package com.xiaolin.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @ClassName TestDynamicProxyByJDK
 * @Description TODO
 * @Detail  使用JDK实现动态代理
 *              1、编写一个接口
 *              2、目标类继承该接口
 *              3、编写一个 handler 去实现 InvocationHandler 接口，重写 invoke 方法，也可以直接使用匿名内部类
 *              4、创建一个代理类，编写一个方法，用户获取代理对象
 * @Author MyPC
 * @Date 2020/9/27
 * @Version 1.0
 */
public class TestDynamicProxyByJDK {
    public static void main(String[] args) {
        Xiaolin xiaolin=new Xiaolin();
        MovingProxy movingProxy=new MovingProxy(xiaolin);
        //要强转成接口，而不是实现了，不然会报类型转换异常
        Move proxy = (Move) movingProxy.getMovingProxy();
        proxy.move();
    }
}

/**
 * 搬家接口
 */
interface Move{
    void move();
}

/**
 * 实际的搬家对象
 */
class Xiaolin implements Move{

    @Override
    public void move() {
        System.out.println("小林家要搬家");
    }
}

/**
 * 搬家代理公司
 */
class MovingProxy{
    //实际的搬家对象
    private Object target;
//    private InvocationHandler handler;
    public MovingProxy(Object target){
        this.target=target;
//        this.handler=handler;
    }

    public Object getMovingProxy(){
        Object o = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("整理房间和打包物品");
                //执行目标对象方法
                method.invoke(target, args);
                System.out.println("将物品放到新家中");
                return null;
            }
        });
        return o;
    }

}